home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 196_01 / fp128.csm < prev    next >
Text File  |  1985-11-13  |  20KB  |  1,403 lines

  1. ;/*
  2. ;*****************************************************************
  3. ;*    Written by : Hakuo Katayose (JUG-CP/M No.179)        *
  4. ;*        JIP 980                        *
  5. ;*        49-114     kawauchi-Sanjuunin-machi        *
  6. ;*        Sendai, Miyagi, Japan.                *
  7. ;*        Telph.No (0222)61-3219                *
  8. ;*    Edited  by :                         *
  9. ;*                                *
  10. ;*****************************************************************
  11. ;*/
  12. ;
  13.     INCLUDE    "BDS.LIB"
  14.  
  15. BIASEXP    EQU    0400H
  16. NBYTES    EQU    16
  17.  
  18. ;
  19. ;--------------------------------------------------------------
  20. ;--------------------------------------------------------------
  21. ;
  22. ; 128_bit floting opration result flags.
  23. ;
  24. ;    EP        1  byte length.
  25. ;    OUTSGN        1  byte length.
  26. ;    OUTBUF        48 byte length.
  27. ;    
  28. ;    OVF        1  byte length.
  29. ;    UNF        1  byte length.
  30. ;    ZERO        1  byte length.
  31. ;    MINUS        1  byte length.
  32. ;
  33. ;--------------------------------------------------------------
  34. ;    
  35. ; 128_bit floting work_registers.
  36. ;
  37. ;    TEMPW        nbytes+5 byte length.
  38. ;    
  39. ;    UU        nbytes byte length.
  40. ;    VV        nbytes byte length.
  41. ;    WW        nbytes byte length.
  42. ;    XX        nbytes byte length.
  43. ;    YY        nbytes byte length.
  44. ;    
  45. ;--------------------------------------------------------------
  46. ;
  47. ; 128_bit floting Acc registers.
  48. ;
  49. ;    LA    128_bit floting ACC_A.        A_Acc extention.
  50. ;    AREG    128_bit floting ACC_A.        A_Acc.
  51. ;    AEXP    128_bit floting ACC_A.        expornemt.
  52. ;    ASIGN    128_bit floting ACC_A.        sign_flag.
  53. ;    
  54. ;    LB    128_bit floting ACC_B.        B_Acc extention.
  55. ;    BREG    128_bit floting ACC_B.        B_Acc.
  56. ;    BEXP    128_bit floting ACC_B.        expornemt.
  57. ;    BSIGN    128_bit floting ACC_B.        sign_flag.
  58. ;    
  59. ;    TEN1    128_bit floting constant.    10.0
  60. ;    ONE    128_bit floting constant.     1.0
  61. ;    TENM1    128_bit floting constant.     0.1
  62. ;    NUM0    128_bit floting constant.     0.0
  63. ;
  64. ;
  65. ;
  66. ;
  67.  
  68.     FUNCTION    fp128
  69.     call    arghak
  70.     push    b
  71.     lda    arg1
  72.     ora    a
  73.     jz    FPTEST
  74.     cpi    11
  75.     jz    FPIN
  76.     cpi    255
  77.     jz    FPTST2
  78.     lhld    arg2
  79.     xchg
  80.     lxi    h,AREG
  81.     call    unpack        ; (arg2) --> Acc. (Unpack).
  82.     lda    arg1
  83.     cpi    10
  84.     jz    FPCONV
  85.     lhld    arg3
  86.     xchg
  87.     lxi    h,BREG
  88.     call    unpack        ; (arg2) --> Bcc. (Unpack).
  89.     lxi    h,exitp
  90.     push    h
  91.     lda    arg1
  92.     cpi    1
  93.     jz    FPMUL0
  94.     cpi    2
  95.     jz    FPDIV0
  96.     cpi    3
  97.     jz    FPADD0
  98.     cpi    4
  99.     jz    FPSUB0
  100.     pop    h
  101.     pop    b
  102.     lxi    h,0
  103.     ret
  104.  
  105. exitp:    lhld    arg4
  106.     xchg
  107.     call    pack
  108.     lxi    h,OVF
  109.     xra    a
  110.     ora    m
  111.     inx    h
  112.     ora    m
  113.     inx    h
  114.     ora    m
  115.     inx    h
  116.     ora    m
  117.     mov    l,a
  118.     mvi    h,0
  119.     pop    b
  120.     ret
  121.  
  122. ;
  123. ;--------------------------------------------------------------
  124. ; FLOATING POINT DIVIDE ------ Acc = Acc / Bcc.
  125. ;--------------------------------------------------------------
  126.  
  127. FPDIV0:    lxi    h,0
  128.     shld    OVF
  129.     shld    ZERO
  130.     lhld    BEXP
  131.     mov    a,h
  132.     ora    l
  133.     jz    ovrfw
  134.     lhld    AEXP
  135.     mov    a,h
  136.     ora    l
  137.     jz    setzero
  138.     ;
  139. fdiv1:    lxi    h,0
  140.     shld    LA
  141.     shld    LA+2
  142.     shld    LA+4
  143.     shld    LA+6
  144.     lxi    h,LA+NBYTES+NBYTES-1
  145.     mvi    b,NBYTES+1
  146.     xra    a
  147.     call    sftr0
  148.     lxi    h,BREG+NBYTES-1
  149.     xra    a
  150.     call    sftr
  151.     lhld    BEXP
  152.     inx    h
  153.     shld    BEXP
  154.     mvi    b,NBYTES*8
  155. fdiv2:    push    b
  156.     lxi    d,AREG+NBYTES-1
  157.     lxi    h,BREG+NBYTES-1
  158.     call    icmp        ; comp  Acc - Bcc.
  159.     jc    fdiv3        ; if Acc < Bcc then fdiv3.
  160.     lxi    d,AREG
  161.     lxi    h,BREG
  162.     call    isub        ; Acc = Acc - Bcc.
  163.     xra    a
  164. fdiv3:    cmc
  165.     lxi    h,LA
  166.     call    sftl
  167.     call    sftl
  168.     pop    b
  169. ;    djnz    fdiv2
  170.     db    010h,0dch
  171.  
  172.     lxi    h,LA
  173.     lxi    d,AREG
  174.     lxi    b,NBYTES
  175.     ldir
  176.     lhld    AEXP
  177.     lxi    d,BIASEXP+2
  178.     dad    d
  179.     xchg
  180.     lhld    BEXP
  181.     xchg
  182.     jmp    expnrm
  183.  
  184.  
  185.  
  186. ;
  187. ;--------------------------------------------------------------
  188. ; FLOATING POINT MULTIPLY ------ Acc = Acc * Bcc.
  189. ;--------------------------------------------------------------
  190. ;
  191. FPMUL0:    lxi    h,0
  192.     shld    OVF
  193.     shld    ZERO
  194.     lhld    BEXP
  195.     mov    a,h
  196.     ora    l
  197.     jz    setzero
  198.     lhld    AEXP
  199.     mov    a,h
  200.     ora    l
  201.     jz    setzero
  202.     ;
  203. fmul3:    lxi    h,AREG
  204.     lxi    d,LA
  205.     lxi    b,nbytes
  206.     ldir
  207.  
  208.     lxi    h,BREG
  209.     call    imul
  210.  
  211.     lhld    AEXP
  212.     xchg
  213.     lhld    BEXP
  214.     dad    d
  215.     lxi    d,BIASEXP
  216.  
  217. expnrm:    ora    a
  218.     dsbc    d
  219.     shld    AEXP
  220.     jc    undrfw
  221.     mov    a,h
  222.     cpi    BIASEXP/128
  223.     jnc    ovrfw
  224.     lda    ASIGN
  225.     lxi    h,BSIGN
  226.     xra    m
  227.     sta    ASIGN
  228.     jmp    fpnorm
  229.  
  230. ;
  231. ;--------------------------------------------------------------
  232. ; FLOATING POINT ADDITION  Acc = Acc + Bcc.
  233. ; FLOATING POINT SUBTRACT  Acc = Acc - Bcc.
  234. ;--------------------------------------------------------------
  235. ;
  236.  
  237. FPSUB0:    lda    BSIGN
  238.     xri    080h
  239.     sta    BSIGN
  240. ;
  241. FPADD0:    lxi    h,0
  242.     shld    OVF
  243.     shld    ZERO
  244.     lhld    AEXP
  245.     mov    a,h
  246.     ora    l
  247.     xchg
  248.     jnz    fadd1
  249.     lxi    h,BREG
  250.     lxi    d,AREG
  251.     lxi    b,NBYTES+3
  252.     ldir
  253.     jmp    fpnorm
  254. fadd1:    lhld    BEXP
  255.     mov    a,h
  256.     ora    l
  257.     jz    fpnorm
  258.     xchg
  259.     dsbc    d
  260.     jz    fadd4
  261.     jnc    fadd2
  262.  
  263.     lda    ASIGN        ; Acc_flag <--> Bcc_flag.
  264.     mov    c,a
  265.     lda    BSIGN
  266.     sta    ASIGN
  267.     mov    a,c
  268.     sta    BSIGN
  269.     lxi    h,AREG
  270.     lxi    d,BREG
  271.     mvi    b,nbytes+2
  272.     call    swap0
  273.  
  274.     shld    BEXP
  275.     xchg
  276.     shld    AEXP
  277.     ora    a
  278.     dsbc    d
  279. fadd2:    mov    a,h
  280.     ora    a
  281.     jnz    fpnorm
  282.     mov    a,l
  283.     cpi    NBYTES*8-1
  284.     jnc    fpnorm
  285.     mov    b,a
  286.     lhld    BEXP
  287.     xchg
  288. fadd3:    push    b
  289.     xra    a
  290.     lxi    h,BREG+NBYTES-1
  291.     call    sftr
  292.     inx    d
  293.     pop    b
  294. ;    djnz    fadd3
  295.     db    010h,0f4h
  296. fadd4:    xchg
  297.     shld    BEXP
  298.     lda    ASIGN
  299.     lxi    h,BSIGN
  300.     xra    m
  301.     jnz    fadd5
  302. ;
  303. ;  if same sign.
  304. ;
  305.     lxi    d,AREG
  306.     lxi    h,BREG
  307.     call    iadd        ; (Acc) = (Acc) + (Bcc).
  308.     jnc    fpnorm
  309.     lxi    h,AREG+NBYTES-1    ; if carry_flag set then,
  310.     call    sftr        ;  shift right
  311.     lhld    AEXP
  312.     inx    h
  313.     shld    AEXP        ;  & exp = exp + 1.
  314.     jmp    fpnorm
  315. ;
  316. ;  if different sign.
  317. ;
  318. fadd5:    lxi    d,AREG
  319.     lxi    h,BREG
  320.     call    isub        ; Acc = Acc - Bcc.
  321.     jnc    fpnorm
  322.     lxi    h,AREG
  323.     call    ineg        ; negate Acc.
  324.     lda    BSIGN
  325.     sta    ASIGN        ; Asign = Bsign.
  326.     call    fpnorm
  327.     ret
  328. ;
  329. ;--------------------------------------------------------------
  330. ; UNPACK (DE) -> (HL).
  331. ;--------------------------------------------------------------
  332. ;
  333.  
  334. UNPACK:    xra    a
  335.     mov    m,a
  336.     inx    h
  337.     push    h
  338.     xchg
  339.     lxi    b,NBYTES
  340.     ldir
  341.     pop    h
  342.     xra    a
  343.     mvi    b,nbytes
  344. unpck1:    rld
  345.     inx    h
  346. ;    djnz    unpck1
  347.     db    010h,0fbh
  348.  
  349.     mov    c,a
  350.     ani    00000111b
  351.     mov    m,a
  352.     mov    a,c
  353.     ani    00001000b
  354.     jz    unpck2
  355.     mvi    a,080h
  356. unpck2:    inx    h
  357.     mov    m,a
  358.     ret
  359. ;
  360. ;--------------------------------------------------------------
  361. ; PACK SOURCE = A REG , DESTINATION = DE.
  362. ;--------------------------------------------------------------
  363. ;
  364.  
  365. pack:    push    d
  366.     lxi    h,OVF
  367.     mov    a,m        ; OVF
  368.     inx    h
  369.     ora    m        ; UNF
  370.     inx    h
  371.     ora    m        ; ZERO
  372.     jnz    pack1
  373.  
  374.     lxi    h,AREG+1
  375.     mov    a,m
  376.     ani    08h
  377.     cnz    inca
  378.  
  379. pack1:    lda    ASIGN
  380.     ora    a
  381.     mvi    c,0
  382.     jz    pack2
  383.     mvi    c,08h
  384. pack2:    lda    AEXP+1
  385.     ani    00000111b
  386.     ora    c
  387.     lxi    h,AEXP
  388.     mvi    b,nbytes
  389. pack3:    rrd
  390.     dcx    h
  391. ;    djnz    pack3
  392.     db    010h,0fbh
  393.  
  394.     inx    h
  395.     pop    d
  396.     lxi    b,NBYTES
  397.     ldir
  398.     RET
  399. ;
  400. ;
  401. ; INCREMENT A AND CORRECT FORM.
  402. ;
  403. inca:    mov    a,m
  404.     ani    0f8h
  405.     adi    08h
  406.     mov    m,a
  407.     rnc
  408.     mvi    b,NBYTES-2
  409. inca1:    inx    h
  410.     inr    m
  411.     rnz
  412. ;    djnz    inca1
  413.     db    010h,0fbh
  414.  
  415.     stc
  416.     call    sftr
  417.     lhld    AEXP
  418.     inx    h
  419.     shld    AEXP
  420.     mov    a,h
  421.     cpi    BIASEXP/128
  422.     rc
  423.     mvi    h,BIASEXP/128-1
  424.     shld    AEXP
  425.     mvi    a,08h
  426.     sta    OVF
  427.     ret
  428.  
  429. ;
  430. ;--------------------------------------------------------------
  431. ; FLOTING NUMBER OUTPUT CONVERTION.
  432. ;--------------------------------------------------------------
  433. ;
  434.  
  435. FPCONV:    lda    ASIGN
  436.     ora    a
  437.     mvi    a,' '
  438.     jz    conv1
  439.     mvi    a,'-'
  440. conv1:    sta    outsgn
  441.     lhld    AEXP
  442.     mov    a,h
  443.     ora    l
  444.     jz    conv9
  445.  
  446.     xra    a
  447.     sta    ASIGN
  448.     lxi    h,0
  449.     shld    EP        ; EP = 0;
  450. conv20:    lxi    h,256
  451.     shld    k2        ; k2 = 256;
  452.  
  453. conv2:    lxi    d,AREG+NBYTES+1
  454.     lxi    h,ONE +NBYTES+1
  455.     mvi    b,nbytes+2
  456.     call    icmp0
  457.     jc    mconv        ; if (A < 1.0) then mconv.
  458.  
  459.     lxi    h,TEN256    ; T  = TEN256;
  460.     shld    T        ;
  461.  
  462. pconv1:    lxi    d,NBYTES+1
  463.     dad    d
  464.     lxi    d,AREG+NBYTES+1
  465.     mvi    b,nbytes+2
  466.     call    icmp0
  467.     jc    pconv2        ; if (A < *T) then  pconv2
  468.  
  469.     lhld    T        ; A = A / *T;
  470.     lxi    d,BREG
  471.     lxi    b,NBYTES+3
  472.     ldir
  473.     call    FPDIV0;
  474.  
  475.     lhld    k2        ; EP = EP + k2;
  476.     xchg
  477.     lhld    EP
  478.     dad    d
  479.     shld    EP
  480.                 ;            }
  481. pconv2:
  482.     lhld    k2
  483.     srlr    h
  484.     rarr    l        ;        k2 = k2 / 2;
  485.     shld    k2
  486.     mov    a,h
  487.     ora    l
  488.     jz    conv3
  489.  
  490.     lhld    T
  491.     lxi    d,nbytes+3
  492.     dad    d
  493.     shld    T        ;        T = T + NBYTES+3;
  494.     jmp    pconv1        ;    }
  495.  
  496. ;
  497. ;
  498. ;
  499. mconv:    lxi    d,AREG+nbytes+1
  500.     lxi    h,TENM1+nbytes+1
  501.     mvi    b,nbytes+2
  502.     call    icmp0
  503.     jnc    conv3        ; if (A >= 0.1) then conv3
  504.  
  505.     lxi    h,TENM128    ; T  = 10**(-128);
  506.     shld    T
  507.  
  508.     lxi    d,AREG+NBYTES+1
  509.     lxi    h,TENM256+NBYTES+1
  510.     mvi    b,nbytes+2
  511.     call    icmp0
  512.     jnc    mconv1        ; if (A >= *T) then mconv2
  513.     lxi    h,TEN256
  514.     lxi    d,BREG
  515.     lxi    b,NBYTES+3
  516.     ldir
  517.     call    FPMUL0;
  518.     lxi    h,TEN256
  519.     lxi    d,BREG
  520.     lxi    b,NBYTES+3
  521.     ldir
  522.     call    FPMUL0;
  523.  
  524.     lxi    h,-512
  525.     shld    EP
  526.     jmp    conv20
  527.  
  528. mconv1:    lhld    T
  529.     lxi    d,nbytes+1
  530.     dad    d
  531.     lxi    d,AREG+NBYTES+1
  532.     mvi    b,nbytes+2
  533.     call    icmp0
  534.     jc    mconv2        ; if (A <